import re

#
#
#
# Python 正则表达式
# re.match函数
# 函数语法：
#
# re.match(pattern, string, flags=0)
# 参数:
# pattern	匹配的正则表达式
# string	要匹配的字符串。
# flags	标志位，用于控制正则表达式的匹配方式，如：是否区分大小写，多行匹配等等
#
# 匹配成功re.match方法返回一个匹配的对象，否则返回None。


# 9.
# 使用Python的r前缀，就不用考虑转义的问题
# s = r'ABC\-001' # Python的字符串
# # 对应的正则表达式字符串不变：
# # 'ABC\-001'

print("-----9--->", re.match(r'^\d{3}\-\d{3,8}$', '010-12345'))
# match()方法判断是否匹配，如果匹配成功，返回一个Match对象，否则返回None。常见的判断方法就是
if re.match(r'^\d{3}\-\d{3,8}$', '010-12345'):
    print('ok')
else:
    print('failed')

# 10.
#  | ^ \d \s . $ 等等基础用法
# 要做更精确地匹配，可以用[]表示范围，比如：
# [0-9a-zA-Z\_]可以匹配一个数字、字母或者下划线；
# [0-9a-zA-Z\_]+可以匹配至少由一个数字、字母或者下划线组成的字符串，比如'a100'，'0_Z'，'Py3000'等等；
# 11.
# A|B可以匹配A或B，所以(P|p)ython可以匹配'Python'或者'python'。
# 12.
# ^表示行的开头，^\d表示必须以数字开头。
# 13.
# $表示行的结束，\d$表示必须以数字结束。
# \d可以匹配一个数字，\w可以匹配一个字母或数字
# '00\d'可以匹配'007'，但无法匹配'00A'；
# .可以匹配任意字符
# 'py.'可以匹配'pyc'、'pyo'、'py!'等等。
# \s可以匹配一个空格（也包括Tab等空白符），所以\s+表示至少有一个空格，例如匹配' '，' '等；

# 14.
# re.split
# split 方法按照能够匹配的子串将字符串分割后返回列表，它的使用形式如下：
#
# re.split(pattern, string[, maxsplit=0, flags=0])
# 切分字符串
# 用正则表达式切分字符串比用固定的字符更灵活
print(" split1", re.split(r'\s+', 'a b   c'))

#
print(" split2", re.split(r'[\s\,\;]+', 'a,b;; c  d'))  # ['a', 'b', 'c', 'd']

# 15.
# 分组
# 正则表达式还有提取子串的强大功能。用()表示的就是要提取的分组（Group）
# ^(\d{3})-(\d{3,8})$分别定义了两个组，可以直接从匹配的字符串中提取出区号和本地号码：
m = re.match(r'^(\d{3})-(\d{3,8})$', '010-12345')
print("分组 test ", m)
print("分组 test ", m.group(0))
print("分组 test ", m.group(1))
print("分组 test ", m.group(2))
# 如果正则表达式中定义了组，就可以在Match对象上用group()方法提取出子串来。

# 贪婪匹配,最后需要特别指出的是，正则匹配默认是贪婪匹配，也就是匹配尽可能多的字符
# 由于\d+采用贪婪匹配，直接把后面的0全部匹配了，结果0*只能匹配空字符串了
print("分组 test", re.match(r'^(\d+)(0*)$', '102300').groups())

# 注意到group(0)永远是原始字符串，group(1)、group(2)……表示第1、2、……个子串。


# 16.编译
# 当我们在Python中使用正则表达式时，re模块内部会干两件事情：
#
# 编译正则表达式，如果正则表达式的字符串本身不合法，会报错；
#
# 用编译后的正则表达式去匹配字符串。
#
# 如果一个正则表达式要重复使用几千次，出于效率的考虑，我们可以预编译该正则表达式，接下来重复使用时就不需要编译这个步骤了，直接匹配
# 编译:
re_telephone = re.compile(r'^(\d{3})-(\d{3,8})$')
# 使用：
print("编译 test ", re_telephone.match('010-12345').groups())

# 17.
# re.search方法
# re.search 扫描整个字符串并返回第一个成功的匹配。
print("search test", re.search('www', 'www.runoob.com'))
print("search test", re.search('com', 'www.runoob.com').span())
